home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 16 / AMIGAplus Sonderheft 16 (1998)(ICP)(DE)[!].iso / pd / anwendungen / ispell-3.1.18bin / interfaces / guispell-1.1 / textclip.c < prev    next >
C/C++ Source or Header  |  1995-09-21  |  2KB  |  108 lines

  1. #pragma msg 148 ignore push
  2. #pragma msg 149 ignore push
  3. #pragma msg 61 ignore push
  4. #include <string.h>
  5. #include <libraries/iffparse.h>
  6. #include <proto/iffparse.h>
  7. #include "libraries.h"
  8. #pragma msg 149 pop
  9. #pragma msg 61 pop
  10.  
  11. /* Check if 0.  If not, then die. */
  12. #define CHECK0(a) if (a) goto die
  13.  
  14. /* Check if non-0.  If not, then die. */
  15. #define CHECKN0(a) if (!(a)) goto die
  16.  
  17. /* Check if greater than or equal to 0.  If not, then die. */
  18. #define CHECKGE0(a) if ((a) < 0) goto die
  19.  
  20. void TextToClip (char *s)
  21. {
  22.   struct IFFHandle *iff;
  23.   
  24.   CHECKN0 (iff = AllocIFF ());
  25.   CHECKN0 (iff->iff_Stream = (ULONG) OpenClipboard (PRIMARY_CLIP));
  26.   InitIFFasClip (iff);
  27.   CHECK0 (OpenIFF (iff, IFFF_WRITE));
  28.  
  29.   CHECKGE0 (PushChunk (iff, 'FTXT', 'FORM', IFFSIZE_UNKNOWN));
  30.  
  31.     CHECKGE0 (PushChunk (iff, 0, 'CHRS', IFFSIZE_UNKNOWN));
  32.     CHECKGE0 (WriteChunkBytes (iff, s, strlen (s)));
  33.     CHECKGE0 (PopChunk (iff));
  34.  
  35. #if 0
  36.     CHECKGE0 (PushChunk (iff, 0L, 'ANNO', IFFSIZE_UNKNOWN));
  37.     CHECKGE0 (WriteChunkBytes (iff, "written by IGadSpell and iffparse", 33));
  38.     CHECKGE0 (PopChunk (iff));
  39. #endif
  40.  
  41.   CHECKGE0 (PopChunk (iff));
  42.  
  43. die:
  44.   if (iff)
  45.     {
  46.       CloseIFF (iff);
  47.       if (iff->iff_Stream)
  48.         CloseClipboard ((struct ClipboardHandle *) iff->iff_Stream);
  49.       FreeIFF (iff);
  50.     }
  51. }
  52.  
  53. int TextFromClip (char *buffer, int size)
  54. {
  55.   struct IFFHandle *iff;
  56.   int good_read = 0;
  57.  
  58.   CHECKN0 (iff = AllocIFF ());
  59.   CHECKN0 (iff->iff_Stream = (ULONG) OpenClipboard (PRIMARY_CLIP));
  60.   InitIFFasClip (iff);
  61.   CHECK0 (OpenIFF (iff, IFFF_READ));
  62.  
  63.   for (;;)
  64.     {
  65.       switch (ParseIFF (iff, IFFPARSE_RAWSTEP))
  66.         {
  67.         case IFFERR_EOC:
  68.           break;
  69.         case IFFERR_EOF:
  70.           goto die;
  71.         case 0:
  72.     {
  73.       struct ContextNode *chunk = CurrentChunk (iff);
  74.  
  75.           if (chunk && chunk->cn_ID == 'CHRS' && chunk->cn_Type == 'FTXT')
  76.         {
  77.           int bytes_read = ReadChunkBytes (iff, buffer, size);
  78.  
  79.               if (chunk->cn_Size == bytes_read)
  80.         good_read = 1;
  81.               if (chunk->cn_Size > bytes_read)
  82.         good_read = -1;
  83.           if (!bytes_read && chunk->cn_Size)
  84.         good_read = 0;
  85.  
  86.           buffer[bytes_read < size ? bytes_read : size - 1] = '\0';
  87.  
  88.               goto die;
  89.             }
  90.           break;
  91.     }
  92.         default:
  93.           goto die;
  94.         }
  95.     }
  96.  
  97. die:
  98.   if (iff)
  99.     {
  100.       CloseIFF (iff);
  101.       if (iff->iff_Stream)
  102.         CloseClipboard ((struct ClipboardHandle *)iff->iff_Stream);
  103.       FreeIFF (iff);
  104.     }
  105.  
  106.   return good_read;
  107. }
  108.